mirror of
https://github.com/armbian/build.git
synced 2025-08-12 06:06:58 +02:00
* Initial Mvebu RFC https://github.com/armbian/build/issues/1426 Signed-off-by: Igor Pecovnik <igor.pecovnik@gmail.com> * mvebu: add missing patches Signed-off-by: Igor Pecovnik <igor.pecovnik@gmail.com> * mvebu: change making u-boot targets to standard way, adjust patches and config Signed-off-by: Igor Pecovnik <igor.pecovnik@gmail.com> * helios4: set default branch to use U-Boot 2018.11 Switch over to U-Boot 2018.11 that has been used for some time in next branch. Signed-off-by: Aditya Prayoga <aditya@kobol.io> * mvebu: helios4: Enable DEV branch Signed-off-by: Aditya Prayoga <aditya@kobol.io> * u-boot: Add RTC support on Clearfog and Helios4 Added DM driver for mvebu RTC and enable it on Clearfog and Helios4 configuration. Signed-off-by: Aditya Prayoga <aditya@kobol.io> * add boot-marvell.cmd backward compatibility The patches added missing variable that used on boot-marvell.cmd and also adjust the some memory addresses to prevent crash due to usage of fdt_high and initrd_high. Signed-off-by: Aditya Prayoga <aditya@kobol.io> * helios4: Added SPI NOR flash target Build bootable SPI NOR flash image. Change the boot order to USB -> SATA -> MMC Signed-off-by: Aditya Prayoga <aditya@kobol.io> * Restore SPI support on U-Boot 2019.04 * mvebu: kernel: Added Wake-On-GPIO and WoL support The patch set was missing during transition. Signed-off-by: Aditya Prayoga <aditya@kobol.io> * [#1429] SolidRun's ARMADA A388 SOM U-Boot ODT Update Old versions of U-Boot did not configure correctly the ODT on data signals of DDR RAM on SolidRun's ARMADA A388 SOMs. According to SolidRun Knowledge Base, the changes already pushed to mainline U-Boot. But then it was overwritten when Marvell DDR Training Tool updated [URL] https://developer.solid-run.com/knowledge-base/armada-38x-som-u-boot-odt-update/ Signed-off-by: Aditya Prayoga <aditya@kobol.io> * [#1429] mvebu: u-boot: Add revision id for Armada 38x B0 Added patch for SolidRun U-Boot v2018.01 and for Helios4 U-Boot v2018.11 Signed-off-by: Aditya Prayoga <aditya@kobol.io> * clearfog: Added SPI NOR flash target Build bootable SPI NOR flash image. Signed-off-by: Aditya Prayoga <aditya@kobol.io> * mvebu: clearfog: DEV branch use mainline U-Boot Also move clearfog base patch into its own board folder. Signed-off-by: Aditya Prayoga <aditya@kobol.io> * mvebu: enable U-Boot uart target Normal MMC image can be used for uart boot using following command: ./tools/kwboot -b u-boot-spl.kwb /dev/ttyUSBX But on Helios4, the SPL failed to continue the booting process if ECC is enabled, so disable it. Since the usage of uart boot is more for rescue/debug, disable autoboot. Signed-off-by: Aditya Prayoga <aditya@kobol.io> * mvebu: NEXT branch use mainline U-Boot Signed-off-by: Aditya Prayoga <aditya@kobol.io> * mvebu: helios4: fix fancontrol related bug during buster testing - On kernel 4.19, cpu thermal sensor changed the name from armada_thermal into f10e4078.thermal. Added this new name to udev rules - Since DEFAULT branch now use kernel 4.14, update fancontrol configuration - Load lm75 kernel module - On kernel 4.19, cpu temp reading about 20 degree C lower, update fancontrol configuration. [URL] https://forum.armbian.com/topic/10214-clearfogpro-possible-change-in-temperature-reporting-between-414next-and-419dev Signed-off-by: Aditya Prayoga <aditya@kobol.io> * mvebu: helios4: Override vendor provided fancontrol unit systemd emit following message on dmesg systemd[1]: /lib/systemd/system/fancontrol.service:9: PIDFile= references path below legacy directory /var/run/, updating /var/run/fancontrol.pid \xe2\x86\x92 /run/fancontrol.pid; please update the unit file accordingly. Override and change the value in the unit file to remove the message. Signed-off-by: Aditya Prayoga <aditya@kobol.io> * mvebu: DEV branch use its own u-boot patch folder The patches are copied over from u-boot-mvebu-next Signed-off-by: Aditya Prayoga <aditya@kobol.io> * mvebu: u-boot: Make clearfog model distinction more obvious While at it, also change SerDes LANE4 into USB 3.0 on Clearfog Base. Signed-off-by: Aditya Prayoga <aditya@kobol.io> * lib: Use apt-get install instead of dpkg on install_deb_chroot() dpkg -i does not install dependencies required by the package. This is needed if the BSP package requires other package that is not installed during debootstrap. Signed-off-by: Aditya Prayoga <aditya@kobol.io> * config: mvebu: helios4: Move various tweak to family_tweak_bsp() Various tweak in family_tweaks_s() only applied to SD card image. Move it to family_tweaks_bsp() so it will also included on the BSP package and applied to existing user. Signed-off-by: Aditya Prayoga <aditya@kobol.io> * config: mvebu: helios4: Add /etc/modules to BSP On kernel 4.19, user need to modify the /etc/modules to add lm75 kernel module. Pack the file into BSP so user no longer needed to modify it. Signed-off-by: Aditya Prayoga <aditya@kobol.io> * mvebu: kernel: Make zbud as built-in module To remove the following error: [ 1.705485] zswap: default zpool zbud not available [ 1.705488] zswap: pool creation failed Signed-off-by: Aditya Prayoga <aditya@kobol.io> * bootscripts: mvebu: Add default value for spi_workaround Signed-off-by: Aditya Prayoga <aditya@kobol.io> * mvebu: kernel: Backport armada_thermal changes to 4.14 (#1452) On kernel 4.19, armada_thermal driver has been fixed to address Marvell's Errata #132698 (The changes first appear on LK 4.16). The result is temperature reading is around 20 degree Celsius lower. Currently armbian-motd apply -20C tweak for both LK 4.14 and LK 4.19 which is incorrect. Instead of adding some logic on what condition to apply the tweak, it is better to remove the tweak and patch the kernel instead. Revert commitb3dd4e9
("[ mvebu ] Put back Armada temperature tweak in motd") which is part of #1421 solution. [URL] https://forum.armbian.com/topic/10214-clearfogpro-possible-change-in-temperature-reporting-between-414next-and-419dev/ Signed-off-by: Aditya Prayoga <aditya@kobol.io> * mvebu: helios4: unified fancontrol config Since LK 4.14 on DEFAULT branch already patched and the temp reading is same as LK 4.19 on NEXT branch, it is no longer needed to separate fancontrol configuration file. Signed-off-by: Aditya Prayoga <aditya@kobol.io> * u-boot: helios4: Remove rev id patch The patch is already applied in helios4 repo, no need to have it in armbian. This revert helios4 part of commit7411c55
Signed-off-by: Aditya Prayoga <aditya@kobol.io> * u-boot: clearfog: enable PCIe support and PCIe reset Signed-off-by: Aditya Prayoga <aditya@kobol.io> * u-boot: clearfog: add boot-marvell.cmd backward compatibility The patches added missing variable that used on boot-marvell.cmd and also adjust the some memory addresses to prevent crash due to usage of fdt_high and initrd_high. Signed-off-by: Aditya Prayoga <aditya@kobol.io> * mvebu: helios4: tweak regarding temperature setting Make fan speed similar compared to pre-patched armada-thermal. Target PWM value around 70 during idle. Signed-off-by: Aditya Prayoga <aditya@kobol.io> * config: sources: clearfog to use u-boot 2018.01 for NEXT branch This changes also affect Helios4. Moved the shared U-Boot source setting back to Helios4 for NEXT branch. Signed-off-by: Aditya Prayoga <aditya@kobol.io> * config: boards: build Stretch image for Clearfog and Helios4 Also remove DEV from Helios4 CLI_TARGET Signed-off-by: Aditya Prayoga <aditya@kobol.io> * kernel: mvebu-next: Disable access to SPI Flash User need to set spi_workaround=yes to enable SPI Flash access and lost access to internal SATA. Signed-off-by: Aditya Prayoga <aditya@kobol.io> * mvebu-next: adjust kernel config * mvebu-dev: bump to 5.2 and adjust kernel configuraion. Tested for building. * Adjust kernel config, add AUFS Signed-off-by: Igor Pecovnik <igor.pecovnik@gmail.com> * mvebu-next: Adjust kernel config, add debug GPIO Signed-off-by: Aditya Prayoga <aditya@kobol.io> * mvebu-dev: separate Clearfog Base U-boot configuration file and patch Signed-off-by: Aditya Prayoga <aditya@kobol.io>
347 lines
11 KiB
Diff
347 lines
11 KiB
Diff
diff --git a/drivers/gpio/gpio-mvebu.c b/drivers/gpio/gpio-mvebu.c
|
|
index adc768f908f1..a2bd264ee92c 100644
|
|
--- a/drivers/gpio/gpio-mvebu.c
|
|
+++ b/drivers/gpio/gpio-mvebu.c
|
|
@@ -92,20 +92,41 @@
|
|
|
|
#define MVEBU_MAX_GPIO_PER_BANK 32
|
|
|
|
-struct mvebu_pwm {
|
|
+enum mvebu_pwm_ctrl {
|
|
+ MVEBU_PWM_CTRL_SET_A = 0,
|
|
+ MVEBU_PWM_CTRL_SET_B,
|
|
+ MVEBU_PWM_CTRL_MAX
|
|
+};
|
|
+
|
|
+struct mvebu_pwmchip {
|
|
void __iomem *membase;
|
|
unsigned long clk_rate;
|
|
+ spinlock_t lock;
|
|
+ bool in_use;
|
|
+
|
|
+ /* Used to preserve GPIO/PWM registers across suspend/resume */
|
|
+ u32 blink_on_duration;
|
|
+ u32 blink_off_duration;
|
|
+};
|
|
+
|
|
+struct mvebu_pwm_chip_drv {
|
|
+ enum mvebu_pwm_ctrl ctrl;
|
|
struct gpio_desc *gpiod;
|
|
+ bool master;
|
|
+};
|
|
+
|
|
+struct mvebu_pwm {
|
|
struct pwm_chip chip;
|
|
- spinlock_t lock;
|
|
struct mvebu_gpio_chip *mvchip;
|
|
+ struct mvebu_pwmchip controller;
|
|
+ enum mvebu_pwm_ctrl default_counter;
|
|
|
|
/* Used to preserve GPIO/PWM registers across suspend/resume */
|
|
u32 blink_select;
|
|
- u32 blink_on_duration;
|
|
- u32 blink_off_duration;
|
|
};
|
|
|
|
+static struct mvebu_pwmchip *mvebu_pwm_list[MVEBU_PWM_CTRL_MAX];
|
|
+
|
|
struct mvebu_gpio_chip {
|
|
struct gpio_chip chip;
|
|
struct regmap *regs;
|
|
@@ -282,12 +303,12 @@ mvebu_gpio_write_level_mask(struct mvebu_gpio_chip *mvchip, u32 val)
|
|
* Functions returning addresses of individual registers for a given
|
|
* PWM controller.
|
|
*/
|
|
-static void __iomem *mvebu_pwmreg_blink_on_duration(struct mvebu_pwm *mvpwm)
|
|
+static void __iomem *mvebu_pwmreg_blink_on_duration(struct mvebu_pwmchip *mvpwm)
|
|
{
|
|
return mvpwm->membase + PWM_BLINK_ON_DURATION_OFF;
|
|
}
|
|
|
|
-static void __iomem *mvebu_pwmreg_blink_off_duration(struct mvebu_pwm *mvpwm)
|
|
+static void __iomem *mvebu_pwmreg_blink_off_duration(struct mvebu_pwmchip *mvpwm)
|
|
{
|
|
return mvpwm->membase + PWM_BLINK_OFF_DURATION_OFF;
|
|
}
|
|
@@ -599,43 +620,76 @@ static int mvebu_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm)
|
|
struct mvebu_pwm *mvpwm = to_mvebu_pwm(chip);
|
|
struct mvebu_gpio_chip *mvchip = mvpwm->mvchip;
|
|
struct gpio_desc *desc;
|
|
+ enum mvebu_pwm_ctrl id;
|
|
unsigned long flags;
|
|
int ret = 0;
|
|
+ struct mvebu_pwm_chip_drv *chip_data;
|
|
|
|
- spin_lock_irqsave(&mvpwm->lock, flags);
|
|
+ spin_lock_irqsave(&mvpwm->controller.lock, flags);
|
|
|
|
- if (mvpwm->gpiod) {
|
|
- ret = -EBUSY;
|
|
- } else {
|
|
- desc = gpiochip_request_own_desc(&mvchip->chip,
|
|
- pwm->hwpwm, "mvebu-pwm");
|
|
- if (IS_ERR(desc)) {
|
|
- ret = PTR_ERR(desc);
|
|
- goto out;
|
|
- }
|
|
+ regmap_read(mvchip->regs, GPIO_BLINK_EN_OFF + mvchip->offset,
|
|
+ &mvchip->blink_en_reg);
|
|
+ if (pwm->chip_data || (mvchip->blink_en_reg & BIT(pwm->hwpwm)))
|
|
+ return -EBUSY;
|
|
|
|
- ret = gpiod_direction_output(desc, 0);
|
|
- if (ret) {
|
|
- gpiochip_free_own_desc(desc);
|
|
- goto out;
|
|
- }
|
|
+ desc = gpiochip_request_own_desc(&mvchip->chip, pwm->hwpwm, "mvebu-pwm");
|
|
+ if (IS_ERR(desc)) {
|
|
+ ret = PTR_ERR(desc);
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ ret = gpiod_direction_output(desc, 0);
|
|
+ if (ret) {
|
|
+ gpiochip_free_own_desc(desc);
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ chip_data = kzalloc(sizeof(struct mvebu_pwm_chip_drv), GFP_KERNEL);
|
|
+ if (!chip_data) {
|
|
+ gpiochip_free_own_desc(desc);
|
|
+ ret = -ENOMEM;
|
|
+ goto out;
|
|
+ }
|
|
|
|
- mvpwm->gpiod = desc;
|
|
+ for (id = MVEBU_PWM_CTRL_SET_A;id < MVEBU_PWM_CTRL_MAX; id++) {
|
|
+ if (!mvebu_pwm_list[id]->in_use) {
|
|
+ chip_data->ctrl = id;
|
|
+ chip_data->master = true;
|
|
+ mvebu_pwm_list[id]->in_use = true;
|
|
+ break;
|
|
+ }
|
|
}
|
|
+
|
|
+ if (!chip_data->master)
|
|
+ chip_data->ctrl = mvpwm->default_counter;
|
|
+
|
|
+ regmap_update_bits(mvchip->regs, GPIO_BLINK_CNT_SELECT_OFF + mvchip->offset,
|
|
+ BIT(pwm->hwpwm), chip_data->ctrl ? BIT(pwm->hwpwm) : 0);
|
|
+
|
|
+ chip_data->gpiod = desc;
|
|
+ pwm->chip_data = chip_data;
|
|
+
|
|
+ regmap_read(mvchip->regs, GPIO_BLINK_CNT_SELECT_OFF + mvchip->offset,
|
|
+ &mvpwm->blink_select);
|
|
out:
|
|
- spin_unlock_irqrestore(&mvpwm->lock, flags);
|
|
+ spin_unlock_irqrestore(&mvpwm->controller.lock, flags);
|
|
return ret;
|
|
}
|
|
|
|
static void mvebu_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
|
|
{
|
|
struct mvebu_pwm *mvpwm = to_mvebu_pwm(chip);
|
|
+ struct mvebu_pwm_chip_drv *chip_data = (struct mvebu_pwm_chip_drv*) pwm->chip_data;
|
|
unsigned long flags;
|
|
|
|
- spin_lock_irqsave(&mvpwm->lock, flags);
|
|
- gpiochip_free_own_desc(mvpwm->gpiod);
|
|
- mvpwm->gpiod = NULL;
|
|
- spin_unlock_irqrestore(&mvpwm->lock, flags);
|
|
+ spin_lock_irqsave(&mvpwm->controller.lock, flags);
|
|
+ if (chip_data->master)
|
|
+ mvebu_pwm_list[chip_data->ctrl]->in_use = false;
|
|
+
|
|
+ gpiochip_free_own_desc(chip_data->gpiod);
|
|
+ kfree(chip_data);
|
|
+ pwm->chip_data = NULL;
|
|
+ spin_unlock_irqrestore(&mvpwm->controller.lock, flags);
|
|
}
|
|
|
|
static void mvebu_pwm_get_state(struct pwm_chip *chip,
|
|
@@ -643,17 +697,24 @@ static void mvebu_pwm_get_state(struct pwm_chip *chip,
|
|
struct pwm_state *state) {
|
|
|
|
struct mvebu_pwm *mvpwm = to_mvebu_pwm(chip);
|
|
+ struct mvebu_pwm_chip_drv *chip_data = (struct mvebu_pwm_chip_drv*) pwm->chip_data;
|
|
+ struct mvebu_pwmchip *controller;
|
|
struct mvebu_gpio_chip *mvchip = mvpwm->mvchip;
|
|
unsigned long long val;
|
|
unsigned long flags;
|
|
u32 u;
|
|
|
|
- spin_lock_irqsave(&mvpwm->lock, flags);
|
|
+ if (chip_data)
|
|
+ controller = mvebu_pwm_list[chip_data->ctrl];
|
|
+ else
|
|
+ controller = &mvpwm->controller;
|
|
+
|
|
+ spin_lock_irqsave(&controller->lock, flags);
|
|
|
|
val = (unsigned long long)
|
|
- readl_relaxed(mvebu_pwmreg_blink_on_duration(mvpwm));
|
|
+ readl_relaxed(mvebu_pwmreg_blink_on_duration(controller));
|
|
val *= NSEC_PER_SEC;
|
|
- do_div(val, mvpwm->clk_rate);
|
|
+ do_div(val, controller->clk_rate);
|
|
if (val > UINT_MAX)
|
|
state->duty_cycle = UINT_MAX;
|
|
else if (val)
|
|
@@ -662,9 +723,9 @@ static void mvebu_pwm_get_state(struct pwm_chip *chip,
|
|
state->duty_cycle = 1;
|
|
|
|
val = (unsigned long long)
|
|
- readl_relaxed(mvebu_pwmreg_blink_off_duration(mvpwm));
|
|
+ readl_relaxed(mvebu_pwmreg_blink_off_duration(controller));
|
|
val *= NSEC_PER_SEC;
|
|
- do_div(val, mvpwm->clk_rate);
|
|
+ do_div(val, controller->clk_rate);
|
|
if (val < state->duty_cycle) {
|
|
state->period = 1;
|
|
} else {
|
|
@@ -683,19 +744,21 @@ static void mvebu_pwm_get_state(struct pwm_chip *chip,
|
|
else
|
|
state->enabled = false;
|
|
|
|
- spin_unlock_irqrestore(&mvpwm->lock, flags);
|
|
+ spin_unlock_irqrestore(&controller->lock, flags);
|
|
}
|
|
|
|
static int mvebu_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
|
|
struct pwm_state *state)
|
|
{
|
|
struct mvebu_pwm *mvpwm = to_mvebu_pwm(chip);
|
|
+ struct mvebu_pwm_chip_drv *chip_data = (struct mvebu_pwm_chip_drv*) pwm->chip_data;
|
|
+ struct mvebu_pwmchip *controller = mvebu_pwm_list[chip_data->ctrl];
|
|
struct mvebu_gpio_chip *mvchip = mvpwm->mvchip;
|
|
unsigned long long val;
|
|
unsigned long flags;
|
|
unsigned int on, off;
|
|
|
|
- val = (unsigned long long) mvpwm->clk_rate * state->duty_cycle;
|
|
+ val = (unsigned long long) controller->clk_rate * state->duty_cycle;
|
|
do_div(val, NSEC_PER_SEC);
|
|
if (val > UINT_MAX)
|
|
return -EINVAL;
|
|
@@ -704,7 +767,7 @@ static int mvebu_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
|
|
else
|
|
on = 1;
|
|
|
|
- val = (unsigned long long) mvpwm->clk_rate *
|
|
+ val = (unsigned long long) controller->clk_rate *
|
|
(state->period - state->duty_cycle);
|
|
do_div(val, NSEC_PER_SEC);
|
|
if (val > UINT_MAX)
|
|
@@ -714,16 +777,16 @@ static int mvebu_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
|
|
else
|
|
off = 1;
|
|
|
|
- spin_lock_irqsave(&mvpwm->lock, flags);
|
|
+ spin_lock_irqsave(&controller->lock, flags);
|
|
|
|
- writel_relaxed(on, mvebu_pwmreg_blink_on_duration(mvpwm));
|
|
- writel_relaxed(off, mvebu_pwmreg_blink_off_duration(mvpwm));
|
|
+ writel_relaxed(on, mvebu_pwmreg_blink_on_duration(controller));
|
|
+ writel_relaxed(off, mvebu_pwmreg_blink_off_duration(controller));
|
|
if (state->enabled)
|
|
mvebu_gpio_blink(&mvchip->chip, pwm->hwpwm, 1);
|
|
else
|
|
mvebu_gpio_blink(&mvchip->chip, pwm->hwpwm, 0);
|
|
|
|
- spin_unlock_irqrestore(&mvpwm->lock, flags);
|
|
+ spin_unlock_irqrestore(&controller->lock, flags);
|
|
|
|
return 0;
|
|
}
|
|
@@ -742,10 +805,10 @@ static void __maybe_unused mvebu_pwm_suspend(struct mvebu_gpio_chip *mvchip)
|
|
|
|
regmap_read(mvchip->regs, GPIO_BLINK_CNT_SELECT_OFF + mvchip->offset,
|
|
&mvpwm->blink_select);
|
|
- mvpwm->blink_on_duration =
|
|
- readl_relaxed(mvebu_pwmreg_blink_on_duration(mvpwm));
|
|
- mvpwm->blink_off_duration =
|
|
- readl_relaxed(mvebu_pwmreg_blink_off_duration(mvpwm));
|
|
+ mvpwm->controller.blink_on_duration =
|
|
+ readl_relaxed(mvebu_pwmreg_blink_on_duration(&mvpwm->controller));
|
|
+ mvpwm->controller.blink_off_duration =
|
|
+ readl_relaxed(mvebu_pwmreg_blink_off_duration(&mvpwm->controller));
|
|
}
|
|
|
|
static void __maybe_unused mvebu_pwm_resume(struct mvebu_gpio_chip *mvchip)
|
|
@@ -754,10 +817,10 @@ static void __maybe_unused mvebu_pwm_resume(struct mvebu_gpio_chip *mvchip)
|
|
|
|
regmap_write(mvchip->regs, GPIO_BLINK_CNT_SELECT_OFF + mvchip->offset,
|
|
mvpwm->blink_select);
|
|
- writel_relaxed(mvpwm->blink_on_duration,
|
|
- mvebu_pwmreg_blink_on_duration(mvpwm));
|
|
- writel_relaxed(mvpwm->blink_off_duration,
|
|
- mvebu_pwmreg_blink_off_duration(mvpwm));
|
|
+ writel_relaxed(mvpwm->controller.blink_on_duration,
|
|
+ mvebu_pwmreg_blink_on_duration(&mvpwm->controller));
|
|
+ writel_relaxed(mvpwm->controller.blink_off_duration,
|
|
+ mvebu_pwmreg_blink_off_duration(&mvpwm->controller));
|
|
}
|
|
|
|
static int mvebu_pwm_probe(struct platform_device *pdev,
|
|
@@ -768,6 +831,7 @@ static int mvebu_pwm_probe(struct platform_device *pdev,
|
|
struct mvebu_pwm *mvpwm;
|
|
struct resource *res;
|
|
u32 set;
|
|
+ enum mvebu_pwm_ctrl ctrl_set;
|
|
|
|
if (!of_device_is_compatible(mvchip->chip.of_node,
|
|
"marvell,armada-370-gpio"))
|
|
@@ -790,12 +854,15 @@ static int mvebu_pwm_probe(struct platform_device *pdev,
|
|
* Use set A for lines of GPIO chip with id 0, B for GPIO chip
|
|
* with id 1. Don't allow further GPIO chips to be used for PWM.
|
|
*/
|
|
- if (id == 0)
|
|
+ if (id == 0) {
|
|
set = 0;
|
|
- else if (id == 1)
|
|
+ ctrl_set = MVEBU_PWM_CTRL_SET_A;
|
|
+ } else if (id == 1) {
|
|
set = U32_MAX;
|
|
- else
|
|
+ ctrl_set = MVEBU_PWM_CTRL_SET_B;
|
|
+ } else {
|
|
return -EINVAL;
|
|
+ }
|
|
regmap_write(mvchip->regs,
|
|
GPIO_BLINK_CNT_SELECT_OFF + mvchip->offset, set);
|
|
|
|
@@ -805,15 +872,13 @@ static int mvebu_pwm_probe(struct platform_device *pdev,
|
|
mvchip->mvpwm = mvpwm;
|
|
mvpwm->mvchip = mvchip;
|
|
|
|
- mvpwm->membase = devm_ioremap_resource(dev, res);
|
|
- if (IS_ERR(mvpwm->membase))
|
|
- return PTR_ERR(mvpwm->membase);
|
|
+ mvpwm->controller.membase = devm_ioremap_resource(dev, res);
|
|
+ if (IS_ERR(mvpwm->controller.membase))
|
|
+ return PTR_ERR(mvpwm->controller.membase);
|
|
|
|
- mvpwm->clk_rate = clk_get_rate(mvchip->clk);
|
|
- if (!mvpwm->clk_rate) {
|
|
- dev_err(dev, "failed to get clock rate\n");
|
|
+ mvpwm->controller.clk_rate = clk_get_rate(mvchip->clk);
|
|
+ if (!mvpwm->controller.clk_rate)
|
|
return -EINVAL;
|
|
- }
|
|
|
|
mvpwm->chip.dev = dev;
|
|
mvpwm->chip.ops = &mvebu_pwm_ops;
|
|
@@ -826,7 +891,9 @@ static int mvebu_pwm_probe(struct platform_device *pdev,
|
|
*/
|
|
mvpwm->chip.base = -1;
|
|
|
|
- spin_lock_init(&mvpwm->lock);
|
|
+ spin_lock_init(&mvpwm->controller.lock);
|
|
+ mvpwm->default_counter = ctrl_set;
|
|
+ mvebu_pwm_list[ctrl_set] = &mvpwm->controller;
|
|
|
|
return pwmchip_add(&mvpwm->chip);
|
|
}
|